# -*- coding: UTF-8 -*- #
"""
-------真正的勇士， 敢于直面惨淡的Warning、 敢于正视淋漓的Error-----
@author : 贾鹏博
@file : 7、强制等待与隐式等待.py
@time : 2022/5/25 19:43
"""

"""
避免页面未渲染完成后操作，导致的报错
强制（直接）等待
    解决方案 : 在报错的元素操作之前添加等待   ->   time.sleep(3)
    原理 ： 强制等待，线程休眠一定时间
    适用场景 ： 调式代码，临时性添加
       
隐式等待
    问题 ： 难以确定元素加载的具体等待时间
    解决方案 ： 针对于寻找元素的这个动作，使用隐式等待添加配置   ->  driver.implicitly_wait(3)
    原理 ： 隐式等待是一种全局的等待方式，设置一个等待时间。轮询查找（默认0.5秒）元素是否出现，如果没出现就抛出异常
    隐式等待设置，一般实例化完 driver 之后，设置一个全局的等待方式。   可以修改重置全局等待时间 driver.implicitly_wait(10) 
    每一个调用 find_element 方法的时候，都会触发隐式等待。   ->   只能解决页面元素等待问题，不能解决元素交互问题
    原理1 ： 在时间范围内，轮询查找元素 
    适用场景 ： 解决找不到元素问题，无法解决交互问题
    

显式等待
    元素可以找到，使用点击等操作，出现报错
    原因：
        1、页面元素加载是异步加载过程，通常 xml 会先加载完成，相应的元素属性（可见、可点击等）后加载
        2、元素存在与否是由 xml 决定，元素的交互是由属性决定
        3、隐式等待只关心元素能不能找到，不关注元素能否点击或者进行其他的交互
    解决方案 ： 使用显式等待   ->  例子
    WebDriverWait(self.driver,10,0.5).until(expected_conditions.element_to_be_clickable((AppiumBy.ID,'com.xueqiu.android:id/tv_search')))
    示例 ：WebDriverWait(driver实例，最长等待时间，轮询时间).until(结束条件)
    原理 ： 在最长等待时间内，轮询，是否满足结束条件 。 
    原理1 ： 设定特定的等待条件，轮询操作
    适用场景 ： 解决特定条件下的等待问题，比如点击交互性行为
    
"""
